// 执行中间件  user:ip,id,user
import handleExceptions from './specialInterface/handleExceptions'
import { ctx } from './inter';

export = async function Middleware(ctx: ctx,route:any){
    return new Promise(async (callback,error)=>{
        // 初始化请求参数
        runMidd(route,ctx).then(e=>{
            callback(e)
        }).catch(err=>{
            // 报错了，进行异常处理
            handleExceptions(ctx,err).then(e=>{
                // 返回错误的处理结果
                error(e)
            }).catch(err=>{
                // 再次报错，不管了，直接返回错误信息
                error({code:500,message:err.toString()})
            })
        })
    })
}

//==================================================================
// 运行中间件 >>回调 >>> 控制器是最后一个中间件
async function runMidd(route:routeInterface,ctx:ctx) :Promise<any>{
    let returnValue = undefined;
    let returnValue2 = await run(route.modules,{index:0})
    return returnValue!== undefined?returnValue: returnValue2;

    async function run(ArrayMidd:Array<controllerStructure>,middlewareInfo){
        let middleware = route.modules[middlewareInfo.index]
        // 开始执行中间件
        while(middleware){
            returnValue = await middleware.module.run(ctx,async ()=>{
                // 执行下一步
                middlewareInfo.index++
                returnValue = await run(ArrayMidd,middlewareInfo) ?? returnValue;
                return returnValue;
            },...middleware.parameter) ?? returnValue;
            if(returnValue !== undefined) return returnValue; 
            middlewareInfo.index++;
            middleware = route.modules[middlewareInfo.index];
        }
        // 执行到这里开始执行控制器
        return await route.controller.module.run(ctx,...(ctx.dynamicRoutingParametersArray || []))
    }
}




